class Node:#定义一个节点
    def __init__(self, data=None):
        self.data = data #元素
        self.next = None #下一个指针


class List:#定义一个单向链表
    def __init__(self):
        self.head = Node() #定义链表头 （此时的链表没有任何元素）
        self.length = 0 #链表长度为零

    def insert(self, pos, data):#指定位置插入一个元素
        assert pos >= 0 and pos <=self.length#如果列表为空，指定位置不能小于0，并且插入的位置不能比列表长度大
        tmpPtr = self.head#把头赋给一个变量
        while pos>0:#开始查找
            tmpPtr=tmpPtr.next#确定pos前一个的节点
            pos-=1
        newNode = Node()#查找到之后先初始化一个节点
        newNode.data = data#节点的元素赋值
        newNode.next =tmpPtr.next#节点指针为原来的指针
        tmpPtr.next = newNode#原节点的指针变为新插入的元素指针
        self.length += 1

    def append(self,data):
        self.insert(self.length,data)

    def remove(self, pos):
        assert pos < self.length#限定删除节点在list内
        tmpPtr = self.head
        while pos > 0:#定位要删除节点的前一个节点
            tmpPtr = tmpPtr.next
            pos -= 1

        if tmpPtr.next is not None:
            # delNode = tmpPtr.next
            # tmpPtr.next = delNode.next #也可以写作
            tmpPtr.next = tmpPtr.next.next
            self.length -= 1

    def foreach(self):
        tmpPtr = self.head.next #定位list的头
        while tmpPtr is not None:
            yield tmpPtr.data
            tmpPtr = tmpPtr.next


    def updata(self,pos,data):
        assert pos < self.length
        tmpPtr = self.head
        while pos >= 0:
            tmpPtr = tmpPtr.next
            pos -= 1

        if pos<self.length:
            tmpPtr.data = data


    def remove1(self,data):
        i=0
        tmpPtr = self.head
        while i<self.length:
            tmpPtr = tmpPtr.next
            if tmpPtr.data==data:
                self.remove(i)
            i+=1





if __name__ =="__main__":
    l = List()
    l.append(2)
    l.append(6)
    l.append(9)
    l.append(7)


    # for x in l.foreach():
    #     print(x)
    #
    # print("Insert new data 4")
    # l.insert(3, 4)
    # for x in l.foreach():
    #     print(x)
    #
    # print("Remove the 2th element")
    # l.remove(3)
    # for x in l.foreach():
    #     print(x)
    #
    l.updata(1,5)
    for x in l.foreach():
        print(x)
    print(l.length)

    print('=======')
    l.remove1(6)
    for x in l.foreach():
        print(x)
    print(l.length)









